<?php
use Illuminate\Http\JsonResponse;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Facades\DB;

use Illuminate\Http\Request;
/**
 * @Notes:请求成功
 * @param string $data
 * @param string $message
 * @param int $code
 * @return JsonResponse
 * @author: Liao Hong
 * @Time: 2025/10/17   11:44
 * @Interface success
 */
function success($data = '', $message = '操作成功', $code = 200): JsonResponse
{
    $result = ['message' => $message, 'code' => $code, 'data' => $data];
    return response()->json($result);
}
/**
 * @Notes:请求失败
 * @param $message
 * @param int $code
 * @param string $data
 * @return JsonResponse
 * @author: Liao Hong
 * @Time: 2025/10/17   11:45
 * @Interface fail
 */
function fail($message, $code = 500, $data = ''): JsonResponse
{
    $result = ['message' => $message, 'code'=> $code, 'data'=> $data];
    return response()->json($result);
}

/**
 * @Notes:格式化打印
 * @param string $data
 * @author: Liao Hong
 * @Time: 2025/10/17   11:46
 * @Interface aa
 */
function aa($data=''){
    echo '<pre>';
    var_dump($data);
    exit();

}
function rm_special($str): string
{
    return str_replace(array('\\', '/', ':', '*', '?', '"', '<', '>', '|'), '', $str);
}
function keywords_cache_key($filter, int $userId = 0, int $projectId = 0): string
{
    return md5(serialize($filter) . serialize($userId) . serialize($projectId));
}
/**
 * 获取token的用户
 */
function user(): ?Authenticatable
{
    return auth('api')->user();
}

/**
 * @Notes:判断是否是超级管理员
 * @return bool
 * @author: Liao Hong
 * @Time: 2025/10/22   8:58
 * @Interface is_super
 */
function is_super(){
    return user()->user_id == 1 ? true :false;
}

/**
 * @Notes:递归构建树形结构
 * @param $items
 * @param int $parentId
 * @return array
 * @author: Liao Hong
 * @Time: 2025/10/22   8:58
 * @Interface buildTree
 */
function buildTree($items, $parentId = 0) {
    $tree = [];
    foreach ($items as $item) {
        if ($item['parent_id'] == $parentId) {
            // 递归查找子节点
            $children = buildTree($items, $item['id']);
            // 构建当前节点
            $node = [
                'id' => $item['id'],
                'label' => $item['menu_name'],
                'disabled' => false
            ];
            // 如果有子节点则添加children属性
            if (!empty($children)) {
                $node['children'] = $children;
            }
            $tree[] = $node;
        }
    }
    return $tree;
}
/**
 * @Notes:获取客户端ip
 * @return string|null
 * @author: Liao Hong
 * @Time: 2025/10/20   14:03
 * @Interface getClientIp
 */
function getClientIp(){
    return  request()->ip();
}

/**
 * @Notes:
 * @param string $title 模块标题
 * @param int $type 业务类型（0其它 1新增 2修改 3删除）
 * @param array $returnData 返回参数
 * @param int $status 操作状态（0正常 1异常）
 * @author: Liao Hong
 * @Time: 2025/10/23   17:31
 * @Interface addLog
 */
function addLog($title = '',$type = 0,$returnData = [],$status = 0){
    $request = app(Request::class);
    $addData = [
        'title'             => $title,//模块标题
        'business_type'     => $type,//'业务类型（0其它 1新增 2修改 3删除）
        'method'            => $request->route()->getActionMethod(),//'方法名称
        'request_method'    => $request->method(),//'请求方式
        'operator_type'     => 1,//操作类别（0其它 1后台用户 2手机端用户）
        'oper_name'         => user()->user_name,//操作人员
        'dept_name'         => user()->dept ? user()->dept->dept_name : '',//部门名称
        'oper_url'          => $request->url(),//请求URL
        'oper_ip'           => getClientIp(),//主机地址
        'oper_param'        => json_encode($request->input()),//请求参数
        'json_result'       => json_encode($returnData),//返回参数
        'status'            => $status,//'操作状态（0正常 1异常）
        'oper_time'         => getTime(),//'操作时间
      //  'cost_time'         => getTime(),//'消耗时间
    ];

    DB::table('oper_log')->insert($addData);
}

/**
 * 使用 cURL 发送 HTTP 请求（支持 GET/POST 及参数传递）
 * @param string $url 目标 URL
 * @param array $params 请求参数（GET 会拼到 URL，POST 会作为请求体）
 * @param string $method 请求方法（GET/POST，默认 GET）
 * @param array $options 额外的 cURL 配置选项
 * @return string|false 成功返回响应内容，失败返回 false
 * @author: Liao Hong
 * @Time: 2025/10/24   11:17
 */

function httpRequest($url, $params = [], $method = 'GET', $options = []) {
    // 初始化 cURL
    $ch = curl_init();
    if (!$ch) {
        return false;
    }
    // 处理 GET 参数（拼接到 URL）
    if (strtoupper($method) === 'GET' && !empty($params)) {
        // 解析 URL 已有参数，避免覆盖
        $urlParts = parse_url($url);
        $query = isset($urlParts['query']) ? $urlParts['query'] : '';
        parse_str($query, $existingParams);
        // 合并已有参数和新参数（新参数会覆盖同名旧参数）
        $mergedParams = array_merge($existingParams, $params);
        // 重新拼接 URL
        $url = $urlParts['scheme'] . '://' . $urlParts['host'] . ($urlParts['path'] ?? '')
            . '?' . http_build_query($mergedParams);
    }
    // 基础配置
    $defaultOptions = [
        CURLOPT_URL            => $url,          // 目标 URL
        CURLOPT_RETURNTRANSFER => true,          // 将结果返回而不是直接输出
        CURLOPT_HEADER         => false,         // 不包含响应头
        CURLOPT_TIMEOUT        => 10,            // 超时时间(秒)
        CURLOPT_CONNECTTIMEOUT => 5,             // 连接超时时间(秒)
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        CURLOPT_SSL_VERIFYPEER => false,         // 关闭 SSL 证书验证（生产环境建议开启）
        CURLOPT_SSL_VERIFYHOST => 0,             // 不验证主机名（配合上面关闭证书验证）
    ];
    // 处理 POST 请求（设置请求方法和参数）
    if (strtoupper($method) === 'POST') {
        $defaultOptions[CURLOPT_POST] = true;    // 启用 POST 方法
        // POST 参数：如果是数组，会自动转为 multipart/form-data；如果是字符串，直接作为请求体
        $defaultOptions[CURLOPT_POSTFIELDS] = is_array($params) ? http_build_query($params) : $params;
        // 可选：设置 Content-Type（表单提交默认是 application/x-www-form-urlencoded）
        $defaultOptions[CURLOPT_HTTPHEADER] = ['Content-Type: application/x-www-form-urlencoded'];
    }
    // 合并用户配置（用户配置会覆盖默认配置）
    $curlOptions = $options + $defaultOptions;
    curl_setopt_array($ch, $curlOptions);
    // 执行请求并获取结果
    $response = curl_exec($ch);
    // 检查是否有错误
    if ($response === false) {
        $error = curl_error($ch);
        error_log("cURL 错误: {$error} (URL: {$url})");
        curl_close($ch);
        return false;
    }
    // 获取响应状态码
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpCode < 200 || $httpCode >= 300) {
        error_log("HTTP 错误状态码: {$httpCode} (URL: {$url})");
        curl_close($ch);
        return false;
    }
    // 关闭 cURL 资源
    curl_close($ch);
    return $response;
}

/**
 * @Notes:获取当前时间
 * @return false|string
 * @author: Liao Hong
 * @Time: 2025/10/20   14:07
 * @Interface getTime
 */
function getTime(){
    return date('y-m-d H:i:s',time());
}
/**
 * 获取登录用户的id , 返回值小于0表示没有找到token里的user
 */
function user_id()
{
    try {
        $user = user();
        return $user->user_id ?? 0;
    } catch (Throwable $ex) {
        return false;
    }
}
/**
 * @Notes:字符串、数组转数组
 * @param $var
 * @return mixed
 * @author: Liao Hong
 * @Time: 2025/10/18   9:50
 * @Interface var_to_array
 */
function var_to_array($var): mixed
{
    if (empty($var)) {
        return [];
    }
    if (is_string($var)) {
        if (str_contains(',', $var)) {
            $var = explode(',', $var);
        }
    }
    settype($var, 'array');

    return $var;
}

/**
 * @Notes:对象转数组
 * @param $obj
 * @return array|void
 * @author: Liao Hong
 * @Time: 2025/10/24   14:02
 * @Interface object_to_array
 */
function object_to_array($obj)
{
    $obj = (array)$obj;
    foreach ($obj as $k => $v) {
        if (gettype($v) == 'resource') {
            return;
        }
        if (gettype($v) == 'object' || gettype($v) == 'array') {
            $obj[$k] = (array)object_to_array($v);
        }
    }
    return $obj;
}
